package grafohamiltoniano;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.io.Serializable;
import java.util.StringTokenizer;

//Esta clase extiende de canvas y proporciona las instrucciones para pintar el grafo y sus componentes
class Lienzo extends Canvas implements Serializable {

    List<Vertice> vertices = new ArrayList<Vertice>(); //Lista de puntos que ubica los vertices
    List<Arista> aristas = new ArrayList<Arista>();
    List<Vertice> ciclohallado = new ArrayList<Vertice>(); //Lista de puntos que ubica los vertices
    Vertice verticeSeleccionado;
    boolean haySeleccion=false;
    boolean hayCiclo=false;
    private int nVertices;
    private int nAristas;
    private int[] grados;

    public void paint(Graphics g){
        g.setColor(Color.BLACK);
	g.fillRect(0,0,700,700);//Borro lo que halla pintando antes rellenando todo el lienzo

        //pinto los vertices
	g.setColor(Color.BLUE); //selecciono color azul

	Iterator iter = vertices.iterator();
	while (iter.hasNext()){
            Vertice v=(Vertice)iter.next();
            g.fillOval(v.RetornaX()-5,v.RetornaY()-5,10,10);
            g.drawString(v.RetornaNombre(),v.RetornaX()-5,v.RetornaY()-10);
        }

        //pìnto las aristas
	g.setColor(Color.GREEN); //selecciono color azul
	Iterator iter2 = aristas.iterator();
	while (iter2.hasNext()){
            Arista arista=(Arista)iter2.next();
            Vertice v1=arista.RetornaVertice1();
            Vertice v2=arista.RetornaVertice2();
            g.drawLine(v1.RetornaX(),v1.RetornaY(),v2.RetornaX(),v2.RetornaY());
        }

	//pinto los vertices seleccionados si hay
	if(haySeleccion){
            g.setColor(Color.GREEN); //selecciono color azul
            g.fillOval(verticeSeleccionado.RetornaX()-7,verticeSeleccionado.RetornaY()-7,14,14);
	}

        //pinto el ciclo si lo hay
        if(hayCiclo){
            g.setColor(Color.RED); //selecciono color azul
            for(int i=0;i<ciclohallado.size()-1;i++){
                //System.out.println("vertice "+ciclohallado.get(i).RetornaNombre());
		g.drawLine(ciclohallado.get(i).RetornaX(),ciclohallado.get(i).RetornaY(),ciclohallado.get(i+1).RetornaX(),ciclohallado.get(i+1).RetornaY());
            }
	}
    } //fin pintura


    public void AgregarPunto(Vertice punto){
        vertices.add(punto);
    }

    public void AgregarArista(Arista ar){
        aristas.add(ar);
    }

    public List<Vertice> RetornaVertices(){
        return(vertices);
    }

    //retorna la posicion del punto ingresado o -1 si no existe
    public int ExisteVertice(Vertice punto){
        int res=-1;
	int i=0;

	Iterator iter = vertices.iterator();
        while (iter.hasNext()){
            Vertice v=(Vertice)iter.next();
	    if(punto.EsIgual(v)){
                res=i;
                break;
            }
            i++;
        }
	return(res);
    }

    public void Limpiar(Graphics g){
        g.setColor(Color.BLACK);
	g.fillRect(0,0,700,700);//Borro lo que halla pintando antes rellenando todo el lienzo
	vertices.clear();
	aristas.clear();
        ciclohallado.clear();
	haySeleccion=false;
        hayCiclo=false;
    }

    public void SeleccionarVertice(int numeroVertice){
        verticeSeleccionado=(Vertice)vertices.get(numeroVertice);
	haySeleccion=true;
    }

    public void DesSeleccionarVertice(){
	haySeleccion=false;
    }

    public boolean HaySeleccionado(){
	return(haySeleccion);
    }

    public Vertice RetornaSeleccionado(){
	return(verticeSeleccionado);
    }

    public Vertice RetornaVertice(int numero){
    	return((Vertice)vertices.get(numero));
    }

    public void setNVertices(int nVertices) {
        this.nVertices = nVertices;
    }

    public void setNAristas(int nAristas) {
        this.nAristas = nAristas;
    }

    public void setGrados(int[] grados) {
        this.grados = grados;
    }

    public int getNVertices() {
        return nVertices;
    }

   public int getNAristas() {
        return nAristas;
    }

   public int[] getGrados() {
        return grados;
    }

   public void PintarCiclo(String ciclo){
	StringTokenizer tok=new StringTokenizer(ciclo,",");
	while(tok.hasMoreTokens()){
		Vertice x=RetornaVertice(Integer.parseInt(tok.nextToken().trim())-1);
		ciclohallado.add(x);
	}
	hayCiclo=true;
    }
}//fin clase lienzo 
